package homework1_array.alg_91;

import static homework1_array.Utils.printList;

public class ArrayHomework {

    public static void main(String[] args) {

        //todo 作业1：完成这个测试方法中的addByElementBySequence()方法
        arrayAddTest();

        // todo 作业2：完成这个测试类中的removeByElement()方法
        deleteTest();

    }

    /**
     * 在有序列表中插入元素
     */
    private static void arrayAddTest() {

        int[] arr = new int[20];
        arr[0] = 3;
        arr[1] = 4;
        arr[2] = 7;
        arr[3] = 8;
// 1.中间位置插入
        addByElementSequenceMiddle(arr, 4, 6);
        printList("在有序数组的中间部分插入元素后的结果为：", arr, 5);
        //此时应输出 3 4 6 7 8

//2.尾部插入
        addByElementSequenceEnd(arr, 5, 9);
        printList("在有序数组的尾部插入元素后的结果为：", arr, 6);
        //此时应输出 3 4 6 7 8 9

//3.数组首部插入
        addByElementSequenceHead(arr, 6, 1);
        printList("在有序数组的首部部分插入元素后的结果为：", arr, 7);
        //此时应输出：1 3 4 6 7 8 9

    }

    //todo 作业1：完成这个方法

    /**
     * @param arr     存储元素的数组
     * @param size    数组中已经存储的元素数量
     * @param element 要插入数组的新元素
     * @return
     */
    public static void addByElementSequenceMiddle(int[] arr, int size, int element) {
        if(arr.length==0){
            throw  new RuntimeException("数组不能为空");
        }
        int mid = size/2;
        int tmp = 0;
        int tmp2 = 0;
        for(int i =0  ;i<size+1;i++){
          if(i == mid){
              tmp = arr[i];
              arr[i] = element;
          }else if(i <mid){
              continue;
          }else if(i>mid){
              tmp2 = arr[i];
              arr[i] = tmp;
              tmp = tmp2;
          }


        }
       // arr = arrNew.clone();
    }

    /**
     * @param arr     存储元素的数组
     * @param size    数组中已经存储的元素数量
     * @param element 要插入数组的新元素
     * @return
     */
    public static void addByElementSequenceEnd(int[] arr, int size, int element) {
        arr[size]= element;

    }

    /**
     * @param arr     存储元素的数组
     * @param size    数组中已经存储的元素数量
     * @param element 要插入数组的新元素
     * @return
     */
    public static void addByElementSequenceHead(int[] arr, int size, int element) {
        int tmp = 0;
        int tmp2 = 0;
        for(int i = 0;i<size+1 ;i++){
                if(i ==0){
                    tmp = arr[i];
                    arr[i] = element;
                }else {
                    tmp2 = arr[i];
                    arr[i] = tmp;
                    tmp = tmp2;
                }

            }
    }

    /**
     * 删除测试
     */
    private static void deleteTest() {
        int[] arr = new int[]{2, 3, 4, 9, 10, 11, 12};

//1.删除头元素
        removeByElementHead(arr, 7, 2);
        printList("删除头元素后的结果为：", arr, 6);
        //此时应该打印 3 4 9 10 11 12

//2. 删除尾元素
        removeByElementEnd(arr, 6, 12);
        printList("删除尾元素的结果为：", arr, 5);
        //此时应该打印 3 4 9 10 11

//3. 删除中间元素：
        removeByElementMiddle(arr, 5, 9);
        printList("删除重元素的结果为：", arr, 4);
        //此时应该打印 3 4 10 11
    }

    /**
     * 从数组中删除元素e
     *
     * @param arr
     * @param size 数组已经存放的元素大小
     * @param key  要删除的元素
     */
    public static void removeByElementHead(int[] arr, int size, int key) {
        int tmp = 0 ;
        for( int i = 0 ;i<size-1;i++){
            if(arr[0] ==key){
                tmp = arr[i+1];
                arr[0] = tmp;
            }else {
                tmp = arr[i+1];
                arr[i] = tmp;
            }

        }

    }
    public static void removeByElementEnd(int[] arr, int size, int key) {
        arr[size-1] = 0;

    }
    public static void removeByElementMiddle(int[] arr, int size, int key) {
       int tmp = 0;
       int mid = size/2;
       for(int i = 0  ;i<size-1; i++){
           if(i == mid){
               tmp = arr[mid+1];
               arr[i] =tmp;
           }else if(i >mid){
               tmp = arr[i +1];
               arr[i] = tmp;
           }
       }

    }
}
